var oDeplact= null;    // ? incorporer ds drag&drop ?
var oReSizeCurs= null;

function  partitionDiv (orientation,prop,div,colorOne,colorTwo) {
//=============================================================
// orientation : soit 'v' = pr?sentation verticale ( une div sur l 'autre)
//               soit 'h' = pr?sentation horizontale
// prop        : proportion initiale [0-1]
// div         : soit div Html pour le cadre externe (= .oHtmlPrinc)
//               soit obj d?crivant dim de la div ext (ex: {top:10, left: 10, width:400, height:200}
// colorOne    : couleur de fond 1ere div 
// colorTwo    : couleur de fond 2ieme div
//
// 4 divs Html :
//   .oHtmlPrinc   cadre externe
//   .one          1ere partie (gauche ou haut suivant orientation)
//   .two          2 ieme partie
//   .barre        tirette

this.orientation = orientation;

// div externe
//------------
if (div.nodeName)
this.oHtmlPrinc  = div.nodeName ? div
                                : new cursPartieFixe(div.top,div.left,div.width.div.height);
// cr?ation de ref depuis l objet Html vers l obj js courant de type splitter 
// (tableau de ref car 1 mme obj Html peut ?tre r?f?rencer ds plusieurs type d objet js
if (!this.oHtmlPrinc.oCiu) 
  this.oHtmlPrinc.oCiu = new Array();
this.oHtmlPrinc.oCiu['splitter'] = this;
// barre mobile = tirette
//-------------
this.barre = (orientation == 'v') ? new cursPartieMobile(0,0, '100%' 
                                    ,partitionDiv.prototype.widthTirette,'red')
                                  : new cursPartieMobile(0,0,partitionDiv.prototype.widthTirette,'100%','red');

/*this.barre = document.createElement('DIV');
this.barre.style.position = 'absolute';
this.barre.style.top = 0;
this.barre.style.left = 0;
this.barre.style.width  = (orientation == 'h') ? '100%' : partitionDiv.prototype.widthTirette ;
this.barre.style.height = (orientation == 'h') ? partitionDiv.prototype.widthTirette : '100%';
//new cursPartieMobile(orientation);
*/
// zone centrale de la tirette
this.barrePosPreDef = document.createElement('DIV');
this.barrePosPreDef.style.fontSize = '0.5';   // n?cessaire uniquement pour IE / hauteur minimim d'une DIV'
this.barrePosPreDef.style.position = 'absolute';
//this.barrePosPreDef.style.top    = (orientation == 'h') ? (parseInt(this.barre.style.height)/3) : 0;
this.barrePosPreDef.style.top    = (orientation == 'h') ? '33%' : 0;
this.barrePosPreDef.style.left   = (orientation == 'h') ? 0 : '33%';//(parseInt(this.barre.style.width)) ;
this.barrePosPreDef.style.width  = (orientation == 'h') ? '100%' : '33%'; //(parseInt(this.barre.style.width));
//this.barrePosPreDef.style.height = (orientation == 'h') ? (parseInt(this.barre.style.height)/3)  : '100%';
this.barrePosPreDef.style.height = (orientation == 'h') ? '33%'  : '100%';
this.barrePosPreDef.style.backgroundColor ='pink';

this.barre.appendChild(this.barrePosPreDef);

var oThis = this;
this.barrePosPreDef.onclick = function (){
  oThis.fixeProp((this.basc = (this.basc == 0) ? 0.8: 0));
// ou   oThis.cursMob.fixeProp((this.basc = (this.basc == 0.2) ? 0.8: 0.2));
}


// divs des 2 parties
//-------------------
//this.one = new cursPartieFixe(0,0,200,148,'gold');
if (orientation == 'v'){
  this.one = new cursPartieFixe(0,0,
                              '100%',
                              prop * (parseInt(this.oHtmlPrinc.style.height) - parseInt(this.barre.style.height)),
                              colorOne);
  this.two = new cursPartieFixe(parseInt(this.one.style.height) + parseInt(this.barre.style.height)
                              ,0
                              ,'100%'  //parseInt(this.oHtmlPrinc.style.width)
                              ,  parseInt(this.oHtmlPrinc.style.height)
                               - parseInt(this.barre.style.height)
                               - parseInt(this.one.style.height)
                              ,colorTwo);
}
else {
//this.one = new cursPartieFixe(0,0,99,300,'gold');
//this.two = new cursPartieFixe(0,101,100,300,'lightblue');
 this.one = new cursPartieFixe(0,0,
                              prop * (pixWidthCurs(this.oHtmlPrinc) - parseInt(this.barre.style.width)),
                              '100%',
                              colorOne);
  this.two = new cursPartieFixe(0
                                ,parseInt(this.one.style.width) + parseInt(this.barre.style.width)
                                ,  pixWidthCurs(this.oHtmlPrinc)
                                 - parseInt(this.barre.style.width)
                                 - parseInt(this.one.style.width)
                                ,'100%'
                                ,colorTwo);

}
this.one.style.fontSize = '0.5';   // n?cessaire uniquement pour IE / hauteur minimim d'une DIV'
this.oHtmlPrinc.appendChild(this.one);

this.two.style.fontSize = '0.5';   // n?cessaire uniquement pour IE / hauteur minimim d'une DIV'
this.oHtmlPrinc.appendChild(this.two);


// curseur repr?sent? par la barre mobile
//---------------------------------------
this.cursMob = new CurseurMobile(this.oHtmlPrinc,
                            this.barre,
                            {  mobilite:'DragAndDrop',
                               orientation: orientation ,
                               rectLim:null
                            } ,
                            prop);

// curseur repr?sent? par les tailles relatives des parties
//---------------------------------------------------------
this.base = AbstractCurseur;
this.base(prop);

// couplage des deux curseurs
//---------------------------
this.handlerSplit = new CouplageCurseurs(prop);
this.handlerSplit.add ( this.cursMob);
this.handlerSplit.add ( this);


}

partitionDiv.prototype = new AbstractCurseur;
partitionDiv.prototype.nbInstances = 0;

partitionDiv.prototype.widthTirette = '4px';

partitionDiv.prototype.placeCurs = function (prop) {
//------------------------------
 this.prop = (prop != null) ? prop : this.prop;

// mise ? jour des pos et dim des 2 divs
//--------------------------------------
 if (this.orientation == 'v'){
 this.one.style.height = Math.max(0,
                           this.prop * ( pixHeightCurs(this.oHtmlPrinc) - parseInt(this.barre.style.height))
                           );

 this.two.style.height = Math.max(0,
                                  pixHeightCurs(this.oHtmlPrinc)
                          -  parseInt(this.one.style.height)
                          -  parseInt(this.barre.style.height));

 this.two.style.top = parseInt(this.one.style.height) +  parseInt(this.barre.style.height);


 }

 else{
   this.one.style.width = Math.max(0,
                             this.prop * ( pixWidthCurs(this.oHtmlPrinc) - parseInt(this.barre.style.width))
                             );
   this.two.style.width =  Math.max(0,
                           pixWidthCurs(this.oHtmlPrinc)
                          -  parseInt(this.one.style.width)
                          -  parseInt(this.barre.style.width)
                          );
   this.two.style.left = parseInt(this.one.style.width) +  parseInt(this.barre.style.width);
 }

// maj ?ventuelle d'1 splitter interne ? une div
//-----------------------------------------------
 if (   this.one.oCiu
     && this.one.oCiu['splitter']
     && this.one.oCiu['splitter'].orientation == this.orientation){
    this.one.oCiu['splitter'].handler.majPosCurs();
 }
 if (   this.two.oCiu
     && this.two.oCiu['splitter']
     && this.two.oCiu['splitter'].orientation == this.orientation){
    this.two.oCiu['splitter'].handler.majPosCurs();
 }

}

function cursPartieFixe(top,left,width,height,bckcol){
//===================================================
var oHtml = document.createElement('DIV');
  oHtml.style.position = 'absolute';
  oHtml.style.top    = top || 0;
  oHtml.style.left   = left || 0;
  oHtml.style.width  = width || 100;
  oHtml.style.height = height || 100;
  oHtml.style.backgroundColor = bckcol || 'green';

// oHtml.className = 'curseurZoneFixe';
// ne fctionne pas avec IE car necessite le chargt ds la page 
//pour que les valeurs soient r?cup?rees  
// les val par d?faut sont donc donn?es ci-dessus en js

  oHtml.id = 'cursPartieFixe_' + (++cursPartieFixe.prototype.nbInstances);

 return oHtml;
}
cursPartieFixe.prototype.nbInstances = 0;

function cursPartieMobile(top,left,width,height,bckcol){
//===================================================
var oHtml = document.createElement('DIV');
  oHtml.className = 'cursAscenseurWin';
  oHtml.style.position = 'absolute';
  oHtml.style.top    = top||0;
  oHtml.style.left   = left||0;
  oHtml.style.width  = width || '100px';
  oHtml.style.height = height || '100px';
 // oHtml.style.backgroundColor = bckcol||'lightblue';
  //oHtml.style.border = 'solid 1px black';
  oHtml.style.border = '1px black outset';
  oHtml.style.fontSize = '0.5';   // n?cessaire uniquement pour IE / hauteur minimim d'une DIV'
  oHtml.id= 'oMobile';
  oHtml.id = 'cursPartieMobile_' + (++cursPartieMobile.prototype.nbInstances);

 return oHtml;
}
cursPartieMobile.prototype.nbInstances = 0;

//_________________________________________________________________________________________________________________________________
function AbstractCurseur(prop){
//===============================
  this.prop = prop||0;
  this.handler = null;
}
AbstractCurseur.prototype.placeIn   = function (oHtml,top,left){
//=============================
  this.oHtmlPrinc.style.top = top;
  this.oHtmlPrinc.style.left = left;
  this.oHtmlPrinc.style.position = 'absolute';

  oHtml.appendChild(this.oHtmlPrinc);
}
AbstractCurseur.prototype.synchro = function(cumulDelta,delta,posInit){
//===============================
// les argt correspondent ?  l appel de synchro depuis le comport DD ou RS
// ils ne sont pas utilis?s ds le cadre des curseurs ( a revoir)
 traceExec('synchro entree this.id= '+this.id+' appel de calculProp this.prop  = '+this.prop,10);
// alert('synchro appel de calculProp');
 this.calculProp();
 traceExec('synchro apres appel de calculProp this.prop= '+this.prop,10);

if (this.handler){
 traceExec('synchro this.handler.id= '+this.handler.id,60);
 traceExec('synchro appel de handler.majPosCurs',10);
// alert('synchro appel de majPosCurs');
// this.handler.majPosCurs(this);
 this.handler.majPosCurs(this,true);
}
else
 traceExec('synchro pas d appel de majPosCurs car pas de handler',10);
 traceExec('synchro sortie',10);
 

}

AbstractCurseur.prototype.synchroDiff = function(){
//===============================
// a voir prevu pour accelere le traitement de maj si Splitter interne
// en ne r?alisant la maj du splitter interne qu'en diff?r? coupl? non plus au MouseMove mais au MouseUp ...
if (this.handler){
  this.calculProp();
  this.handler.majPosCurs();
}
}

AbstractCurseur.prototype.fixeProp = function (prop,force) {
//================================
if (this.handler){
  this.handler.majPosCurs({prop:prop},force);
}
else{
//  alert('pas de handler associ?');
  this.placeCurs(prop);
}
}

AbstractCurseur.prototype.placeCurs = function (){
 return;
}
AbstractCurseur.prototype.calculProp = function (){
 return;
}
/*
//_________________________________________________________________________________________________________________________________
function CurseurChampProp(){
}
*/
//_________________________________________________________________________________________________________________________________
function CurseurCpleBton(limitDeplact,prop,btonUp,btonDown){
this.base = AbstractCurseur;
this.base(prop);

this.limitDeplact             = limitDeplact;
this.val                      = limitDeplact.posRelI     || 0;
this.limitDeplact.amplitude   = limitDeplact.ampl        || 100;
this.limitDeplact.circulaire  = limitDeplact.circulaire  || false;
this.limitDeplact.varDiscrete = limitDeplact.varDiscrete || false;
this.limitDeplact.nbVal       = limitDeplact.nbVal       || 2;
this.limitDeplact.tabVal      = limitDeplact.tabVal      || null;

if (   this.limitDeplact.varDiscrete
    && this.limitDeplact.nbVal)   {
      this.limitDeplact.iPas    =  this.limitDeplact.amplitude / this.limitDeplact.nbVal;
      this.limitDeplact.prctPas =  1 / this.limitDeplact.nbVal;
      this.limitDeplact.index = 0;
      traceExec('this.limitDeplact.iPas='+this.limitDeplact.iPas,50);
}

traceExec('this.limitDeplact.varDiscrete'+((this.limitDeplact.varDiscrete == false)?' non discrete':' discrete'),10);
this.scroll = false;

this.oHtml           = document.createElement('DIV');
this.oHtml.className = 'cursCpleBton';

this.oHtmlPrinc    = this.oHtml;
this.oHtmlPrinc.id = 'curs_cple_bton_' + (++CurseurCpleBton.prototype.nbInstances);

this.oHtmlBtonPlus           = btonUp ? btonUp : document.createElement('DIV');
this.oHtmlBtonPlus.oCiu      = this;
this.oHtmlBtonPlus.className = btonUp ?'cursBton': 'cursBtonUp';

this.oHtmlBtonPlus.id        = 'curs_cple_bton_plus_' + CurseurCpleBton.prototype.nbInstances;

// this.oHtmlBtonPlus.onmousedown   = propUp;

this.oHtmlBtonPlus.onmousedown   = function (e){
//----------------------------
    if (!e) var e = window.event;
    this.oCiu.scroll = true;
    this.oCiu.displayProp();
    this.oCiu.propUp();
    stopEvent(e);
}


this.oHtmlBtonPlus.onmouseup   = this.oHtmlBtonPlus.onmouseout= function (e){
//------------------------
    if (!e) var e = window.event;
    this.oCiu.scroll = false;
    this.oCiu.displayProp();
    stopEvent(e);
}
this.oHtmlBtonPlus.onmouseover   = function (e){
//----------------------------
    if (!e) var e = window.event;
    this.oCiu.displayProp();
}

 this.oHtml.appendChild(this.oHtmlBtonPlus);

 // un seul bouton disponible
if (this.limitDeplact.oneBton)
 this.limitDeplact.circulaire = true;


// deux boutons correspondant aux 2 sens de variation
else{
 this.oHtmlBtonMoins = btonDown ? btonDown :  document.createElement('DIV');
 this.oHtmlBtonMoins.oCiu = this;
 this.oHtmlBtonMoins.className = btonDown ? 'cursBton': 'cursBtonDown';
 this.oHtmlBtonMoins.id = 'curs_cple_bton_moins_' + CurseurCpleBton.prototype.nbInstances;

 this.oHtmlBtonMoins.onmousedown   = function (e){
 //----------------------------
     if (!e) var e = window.event;
     this.oCiu.scrollDown = true;
     this.oCiu.displayProp();
     this.oCiu.propDown();
     stopEvent(e);

 }


 this.oHtmlBtonMoins.onmouseup   = this.oHtmlBtonMoins.onmouseout = function (e){
 //------------------------
     if (!e) var e = window.event;
     this.oCiu.scrollDown = false;
     this.oCiu.displayProp();
     stopEvent(e);
 }
 this.oHtmlBtonMoins.onmouseover   = function (e){
 //----------------------------
     if (!e) var e = window.event;
     this.oCiu.displayProp();
 }

 // affichage de la proportion this.oHtmlAffVal

 this.oHtml.appendChild(this.oHtmlBtonMoins);
 }
}

CurseurCpleBton.prototype = new AbstractCurseur;
CurseurCpleBton.prototype.nbInstances = 0;

CurseurCpleBton.prototype.displayProp = function(){
     //rialto window.status ='proportion actuelle ='+this.prop;
}

CurseurCpleBton.prototype.propUp = function (id){
//==============================
    if (id){
      var  btonHtml = document.getElementById(id);
      var oThis = btonHtml.oCiu;
    }
    else
    {
      oThis = this;
    }

    // variation continue
    if (! oThis.limitDeplact.varDiscrete){
      if (oThis.scroll){
        oThis.val++;
        oThis.val = (oThis.val > oThis.limitDeplact.amplitude) ?  (oThis.limitDeplact.circulaire ? 0
                                                                                                 : oThis.limitDeplact.amplitude)
                                                               :  oThis.val;
        oThis.synchro();

        oThis.scrollIdTimeout = setTimeout("CurseurCpleBton.prototype.propUp(\""+oThis.oHtmlBtonPlus.id+"\")",1);
      }
      else{
        clearTimeout(oThis.scrollIdTimeout);
      }
    }

    // variation discr?te
    else{
      // avec pas fixe
      if (!oThis.limitDeplact.tabVal){
      traceExec('propUp: oThis.val='+oThis.val,50);
        oThis.val = ((oThis.val + oThis.limitDeplact.iPas) > oThis.limitDeplact.amplitude) ?
                                       (oThis.limitDeplact.circulaire ? 0
                                                                      :oThis.val)
                                    :  (oThis.val + oThis.limitDeplact.iPas);
      traceExec('propUp: nv oThis.val='+oThis.val,50);
      }
      // avec tableau de valeurs    a revoir
      else{
        oThis.index = Math.min (oThis.index + 1, oThis.limitDeplact.nbVal);
      }

      oThis.synchro();
    }
}

CurseurCpleBton.prototype.propDown = function (id){
//================================
    if (id){
      var  btonHtml = document.getElementById(id);
      var oThis = btonHtml.oCiu;
    }
    else
    {
      oThis = this;
    }


    // variation continue
    if (! oThis.limitDeplact.varDiscrete){
      if (oThis.scrollDown){
        oThis.val--;
        oThis.val = (oThis.val < 0) ?  (oThis.limitDeplact.circulaire ? oThis.limitDeplact.amplitude
                                                                   : 0)
                                 :  oThis.val;
        oThis.synchro();

        oThis.scrollDownIdTimeout = setTimeout("CurseurCpleBton.prototype.propDown(\""+oThis.oHtmlBtonPlus.id+"\")",1);
      }
      else{
        clearTimeout(oThis.scrollDownIdTimeout);
      }
    }
    // variation discr?te
    else
      // avec pas fixe
      if (!oThis.limitDeplact.tabVal){
      traceExec('propDown: oThis.val='+oThis.val,50);
        oThis.val = ((oThis.val - oThis.limitDeplact.iPas) < 0) ?
                                       (oThis.limitDeplact.circulaire ? (this.limitDeplact.amplitude - this.limitDeplact.iPas)
                                                                      : oThis.val)
                                    :  (oThis.val - oThis.limitDeplact.iPas);
      traceExec('propDown: nv oThis.val='+oThis.val,50);
      }
      // avec tableau de valeurs    a revoir
      else{
        oThis.index = Math.max (oThis.index - 1, 0);
      }
      oThis.synchro();
}

CurseurCpleBton.prototype.placeCurs= function(prop){
//=================================
     this.prop = (prop != null) ? prop : this.prop;


    // variation continue
    if (! this.limitDeplact.varDiscrete)
       this.val = this.limitDeplact.amplitude * this.prop ;

    // variation discrete
    else
      // avec pas fixe
      if (!this.limitDeplact.tabVal){
      traceExec('placeCurs: this.val='
               +'this.prop('+this.prop
               +') / this.prctPas=('+this.limitDeplact.prctPas+')',50);
       traceExec('parseInt(this.prop / this.limitDeplact.prctPas)='
       +parseInt(this.prop / this.limitDeplact.prctPas),50);
       this.val = this.limitDeplact.amplitude * ((parseInt(this.prop / this.limitDeplact.prctPas)) * this.limitDeplact.prctPas);

      traceExec('placeCurs: nv this.val='+this.val,50);
      }

      // avec tableau de valeurs    a revoir
      else{ this.val = 'arevoir';
      }
}

CurseurCpleBton.prototype.calculProp= function(){
//==================================
    // variation continue
    if (! this.limitDeplact.varDiscrete)
       this.prop = this.val / this.limitDeplact.amplitude;
    // variation discrete
    else
      // avec pas fixe
      if (!this.limitDeplact.tabVal){
      traceExec('calculprop: this.prop='+this.prop,50);
        this.prop = this.val / this.limitDeplact.amplitude;
      traceExec('calculprop: nv this.prop='+this.prop,50);
      }
      // avec tableau de valeurs    a revoir
      else{ this.prop = 'arevoir';
      }

}



//_________________________________________________________________________________________________________________________________

//function CurseurMobile(oFixe, oMobile, descrVariation1, descrVariation2, prop){
function CurseurMobile(oFixe, oMobile, descrVariation1, prop){
//============================================================================
// descrVariation(1|2) = param?trage des variations (2 variations max cumulables de 2 types possibles : mobilit?, redimentionnement)
// restriction (? reprendre) :
//   oFixe et oMobile doivent avoir des dimensions inline ou ?tre d?ja charg?s ds doct
traceExec('CurseurMobile constructeur entree',76);
this.base = AbstractCurseur;
this.base(prop);
traceExec('CurseurMobile constructeur apres appel classe base',76);

this.id = this.idObjComp = 'CurseurMobile_' + CurseurMobile.prototype.nbInstances++;

this.oHtmlFixe   = oFixe;

this.oHtmlMobile = oMobile;
this.oHtmlFixe.appendChild(this.oHtmlMobile);


if (!this.oHtmlMobile.oCiu)
  this.oHtmlMobile.oCiu = new Array();
this.oHtmlMobile.oCiu[descrVariation1.mobilite] = this;

if (descrVariation1){
  this.typeMobilite = descrVariation1.mobilite;
  
//  this.loadLimits(descrVariation1,prop);

// ajouter la possibilite non interactif avec seult calcul des limites:loadLimits...
//    alert('interaction avec l utilisateur');
  if (!descrVariation1.nonInteractif){
    //en l etat actuel du DD generique le comportement doit etre attach? ? l objet 
    //ayant la m?thode synchro pour en beneficier
/*
this.oHtmlMobile.comportMobile = eval(descrVariation1.mobilite);
this.oHtmlMobile.comportMobile(descrVariation1);
*/
    if (!descrVariation1)
      descrVariation1 = new Object;
    
    descrVariation1.objetCibleEvt  = this.oHtmlMobile;
    traceExec('cursMob descrVariation1.objetCibleEvt= '+descrVariation1.objetCibleEvt.id,76);
    descrVariation1.objetADeplacer = this.oHtmlMobile;

    descrVariation1.objetADeformer = this.oHtmlMobile;
    descrVariation1.cibleEvt  = { oHtml:this.oHtmlMobile}


    this.comportMobile = eval(descrVariation1.mobilite);
    traceExec('CurseurMobile affectation comport '+descrVariation1.mobilite,39);
    this.comportMobile(descrVariation1);
//    traceExec('apres CurseurMobile affectation comport '+descrVariation1.mobilite,1);
//    traceExec('descrVariation1= '+descrVariation1,1);
    
    // pour FireFox
    this.afterMD = function () {this.DDCursTemoin = true;}
    this.afterDD = function () {this.DDCursTemoin = false;}

/*    
traceExec('cursmob apres attribution DD',58);
traceExec('cursmob this.limitDeplact.rectLim.top= '   +this.limitDeplact.rectLim.top,58);
traceExec('cursmob this.limitDeplact.rectLim.left= '  +this.limitDeplact.rectLim.left,58);
traceExec('cursmob this.limitDeplact.rectLim.right= ' +this.limitDeplact.rectLim.right,58);
traceExec('cursmob this.limitDeplact.rectLim.bottom= '+this.limitDeplact.rectLim.bottom,58);
*/    
  }
//  else
//    alert('pas d interaction');
}
/*
if (descrVariation2){
  this.loadLimits(descrVariation2,prop);
  this.oHtmlMobile.comportMobile2 = eval(descrVariation2.mobilite);
  this.oHtmlMobile.comportMobile2(descrVariation2);
}
*/
//this.oHtmlFixe.appendChild(this.oHtmlMobile);

//if (this.prop != 0)
traceExec('-> placeCurs this.id= '+this.id,76);
//pour voir 19/04 regle le pb des dimensions inconnues ? ce stade ds autoScroll -> ? param?trer
// mais est ce utile ?
  //this.placeCurs(this.prop);
   
//   alert('curseurMobile this.id= ' + this.id + ' synchro = '+this.synchro);

}


CurseurMobile.prototype = new AbstractCurseur;
CurseurMobile.prototype.nbInstances = 0;

CurseurMobile.prototype.calculProp = function () {
//================================
traceExec('calculProp entree CurseurMobile.prop = '+this.prop,10);
if (this.typeMobilite == 'DragAndDrop'){

traceExec('calculprop deb this.prop = '+this.prop,39);

 if (this.limitDeplact.orientation == 'h')
          this.prop =   (parseInt(this.oHtmlMobile.style.left)   - this.limitDeplact.rectLim.left)
                      / (   (this.limitDeplact.rectLim.right - this.limitDeplact.rectLim.left)
                         -  parseInt(this.oHtmlMobile.style.width));
  else
  if (this.limitDeplact.orientation == 'v'){
        traceExec('parseInt(this.oHtmlMobile.style.top) = '+parseInt(this.oHtmlMobile.style.top),10);
           traceExec('this.limitDeplact.rectLim.top = '+this.limitDeplact.rectLim.top,10);
         traceExec('this.limitDeplact.rectLim.bottom = '+this.limitDeplact.rectLim.bottom,10);
        //  traceExec('!:!:!:!:!:!:!parseInt(this.oHtmlMobile.offsetHeight) = '+parseInt(this.oHtmlMobile.offsetHeight),3);
            traceExec('parseInt(this.oHtmlMobile.style.height) = '+parseInt(this.oHtmlMobile.style.height),10);
     
//     offsetHeight pose 1 pb ds IE !!! cf ds placeCurs egalt 
//alert('calculProp this.oHtmlMobile.style.heigh= '+this.oHtmlMobile.style.height);
//          this.prop =   (parseInt(this.oHtmlMobile.style.top)   - this.limitDeplact.rectLim.top)
        var posTexte =  Math.abs(   this.limitDeplact.rectLim.top
                                  - parseInt(this.oHtmlMobile.style.top))  ;
        this.prop =   (posTexte == 0) 
                      ? 0
                      :   posTexte
                        / (   (this.limitDeplact.rectLim.bottom - this.limitDeplact.rectLim.top)
//                         -  parseInt(this.oHtmlMobile.offsetHeight));
                           -  parseInt(this.oHtmlMobile.style.height)
                           - borderIfNecess(this.oHtmlMobile)
                         );
//    this.cursTemoinPos.oHtmlMobile.style.height += borderIfNecess(this.cursTemoinPos.oHtmlMobile);
//traceExec('borderWidth = '+ borderIfNecess(this.oHtmlMobile),9);   
 
 }
traceExec('calculProp ap calcul CurseurMobile.prop = '+this.prop,10);

  if (this.complementProp)     {     
    this.prop = 1 - this.prop;   // proportion normalis?e 
    traceExec('calculProp rectification complt CurseurMobile.prop = '+this.prop,10);    
  }

traceExec('calculprop fin this.prop = '+this.prop,10);

}
else
if (this.typeMobilite == 'ReSize'){
traceExec('calculProp ReSize this.limitReDim.orientation= '+this.limitReDim.orientation,60);
  if (this.specs.orientation == 'h')
         this.prop =     (parseInt(this.oHtmlMobile.style.width)- this.limitReDim.widthMin)
                      /  (   this.limitReDim.widthMax
                           - this.limitReDim.widthMin );

  else
  if (this.specs.orientation == 'v'){
         this.prop =     (parseInt(this.oHtmlMobile.style.height) - this.limitReDim.heightMin)
//         this.prop =     (parseInt(this.oHtmlMobile.offsetHeight) - this.limitReDim.heightMin)
                      /  (   this.limitReDim.heightMax
                           - this.limitReDim.heightMin);

traceExec('calculProp this.prop = '+this.prop,60);

  }
  
  else
  if (this.specs.orientation == '2D')
  // a revoir choix arbitraire
         this.prop =     (parseInt(this.oHtmlMobile.style.width)- this.limitReDim.widthMin)
                      /  (   this.limitReDim.widthMax
                           - this.limitReDim.widthMin );

  }
  this.displayProp();
  return this.prop;
}

CurseurMobile.prototype.displayProp = function(){
//==============================================     
//     window.status ='proportion actuelle ='+ (this.complementProp ? (1- this.prop) : this.prop)
/* rialto    window.status ='('+(this.handler?this.handler.prop:'curs d?coupl?')+')'
     +'proportion actuelle ='+ this.prop
     + '   posTopRel= '+(parseInt(this.oHtmlMobile.style.top)   - this.limitDeplact.rectLim.top)
     + ' / amplLim = '+(this.limitDeplact.rectLim.bottom - this.limitDeplact.rectLim.top)
     + ' - hMob = '+parseInt(this.oHtmlMobile.style.height);
*/}

CurseurMobile.prototype.placeCurs = function (prop) {
//=================================================
// configuration du curseur en fonction de la proportion prop pass?e en argument
// = positionne le curseur mobile + fixe l'attribut prop de l'objet curseur 

// tenir compte de majDyn = true !!!
traceExec('placeCurs entree this.id= '+this.id+' prop= '+prop,10); //
//alert(' placeCurs this.id= '+this.id);
var propNorm = prop;

//if (prop != null)
// this.prop = prop;
 
// r?actualisation : pas de chgt de prop mais chgt du contexte (contrintes limitdeplact)

//a revoir ...
//else{
/*
if (this.limitDeplact && this.limitDeplact.rectLimDyn){
  this.loadLimits(          {  mobilite: this.typeMobilite,
                               orientation: this.limitDeplact.orientation ,
                               rectLim:null
                            }
                  );

}
*/
if (this.typeMobilite == 'DragAndDrop'){
//-----------------------------------
  if (this.limitDeplact  && this.complementProp) {
     prop = 1 - prop;
     traceExec('placeCurs prop modifie utilis?e pour calc= '+prop,10);
  }

  if (   (this.limitDeplact.orientation == 'h')
      || (this.limitDeplact.orientation == '2D')) {
     this.oHtmlMobile.style.left  = (    this.limitDeplact.rectLim.left
                                      +  (     (this.limitDeplact.rectLim.right - this.limitDeplact.rectLim.left)
                                            -  parseInt(this.oHtmlMobile.style.width))
                                         * prop);
//                                         * this.prop);
  }
  if (   (this.limitDeplact.orientation == 'v')
      || (this.limitDeplact.orientation == '2D')){
      traceExec('placeCurs this.id= '+this.id,10);
      traceExec('placeCurs this.limitDeplact.rectLim.bottom = '+this.limitDeplact.rectLim.bottom,10);
      traceExec('placeCurs this.limitDeplact.rectLim.top = '+this.limitDeplact.rectLim.top,10);
      traceExec('placeCurs this.oHtmlMobile.style.height = '+this.oHtmlMobile.style.height,10);
//      traceExec('placeCurs this.oHtmlMobile.offsetHeight = '+this.oHtmlMobile.offsetHeight,3);
      traceExec('placeCurs prop = '+prop,10);
// offsetHeigh pose 1 pb dans IE !!!  cf egalt ds calculProp
//alert('placeCurs this.oHtmlMobile.style.height= '+this.oHtmlMobile.style.height);
      traceExec('placeCurs avant calcul this.oHtmlMobile.style.top= '+this.oHtmlMobile.style.top,10);
      this.oHtmlMobile.style.top  = (    this.limitDeplact.rectLim.top
                                      +  (      (this.limitDeplact.rectLim.bottom - this.limitDeplact.rectLim.top)
                                               -  parseInt(this.oHtmlMobile.style.height))
//                                             -  parseInt(this.oHtmlMobile.offsetHeight))
                                         * prop);
//                                         * this.prop);

      traceExec('placeCurs ap calcul this.oHtmlMobile.style.top= '+this.oHtmlMobile.style.top,10);
    }
}
else
if (this.typeMobilite == 'ReSize'){
//-----------------------------------
  if (this.specs.orientation != 'v'){        // horizontal ou 2D
     var amplMax  = this.limitReDim.widthMax  - this.limitReDim.widthMin;
     var nvWidth = Math.floor( (amplMax * prop) + this.limitReDim.widthMin);
     if (this.limitReDim.centrage)  {
        var diffLeft = Math.floor( (nvWidth - parseInt(this.oHtmlMobile.style.width))/2);
        this.oHtmlMobile.style.left    =  parseInt(this.oHtmlMobile.style.left) - (diffLeft) ;
        this.oHtmlMobile.style.width =  parseInt(this.oHtmlMobile.style.width) + (diffLeft * 2) ;
     }
     else
        this.oHtmlMobile.style.width =  nvWidth;
  }


  if (this.specs.orientation != 'h'){       // vertical ou 2D
     var amplMax  = this.limitReDim.heightMax  - this.limitReDim.heightMin;
     var nvHeight = Math.floor ( (amplMax * prop) + this.limitReDim.heightMin );
     if (this.limitReDim.centrage){
        var diffTop = Math.floor((nvHeight - parseInt(this.oHtmlMobile.style.height))/2);
        this.oHtmlMobile.style.top    =  parseInt(this.oHtmlMobile.style.top) - diffTop ;
        this.oHtmlMobile.style.height =  parseInt(this.oHtmlMobile.style.height) + (diffTop * 2) ;
     }
     else
        this.oHtmlMobile.style.height =  nvHeight;
  }
}
this.prop = propNorm;
     traceExec('placeCurs sortie this.prop= '+this.prop,10);

}

CurseurMobile.prototype.placeIn   = function (oHtml,top,left,position){
//=============================
  this.oHtmlFixe.style.top = top;
  this.oHtmlFixe.style.left = left;
  this.oHtmlFixe.style.position = position || 'absolute';

  oHtml.appendChild(this.oHtmlFixe);
}

//_________________________________________________________________________________________________________________________________

function CouplageCurseurs (prop){
//=========================
// Coupleur d'objets (de type AbstractCurseur par ex) repr?sentants une proportion 
// Assure l'harmonisation des proportions repr?sent?es par ces objets
// ces objets doivent s'enregistrer en utilisant la m?thode add d'un coupleur
//                 et d?clencher la synchronisation en utilisant la m?thode majPosCursdu m?me coupleur

  this.id = 'CouplageCurseurs_' + CouplageCurseurs.prototype.nbInstances++;
  this.cursLies = new Array ();   // stockage des ref sur les curseurs li?s
//  this.cursLies = new Pile();   // stockage des ref sur les curseurs li?s
  this.prop = prop || 0;          // valeur courante des curseurs li?s
}

CouplageCurseurs.prototype.nbELtsCouples = function (){
//=====================================
alert('reste '+this.cursLies.length+' elts');
return this.cursLies.length;
}

CouplageCurseurs.prototype.add = function (curs,bMajPosCurs,prop){
//============================
// couplage d un nouvel objet (repr?sentant une proportion) ? la s?rie d?ja constitu?e
// (= ajout au tableau des curseurs coupl?s + configuration du curseur en fonction des autres)
// options : bMajPosCurs : boolean, prop entier de 0 ? 1
//  si bMajPosCurs = true: met ? jour l'attribut prop du handler de curseur et la configuration des curseurs li?s
// (= alignement de la configuration de l'ensemble des curseurs)
//    en prenant comme base l'argt prop s'il existe ou la prop associ?e ? curs sinon

// autrement dit soit le curseur ajout? s'aligne sur les curseurs d?ja g?r? par le handler 
// soit il impose aux autres curseurs son attribut prop, ?ventuellement fix? lors de l'appel de add (pr?sence argt prop)
// (--> si bMajPosCurs et prop=null curs doit avoir 1 attribut prop valide)

curs.handler = this;            // ref sur l obj g?rant le couplage depuis l objet nouvellement coupl?
//this.cursLies.push(curs);       // ajout de l objet ? coupler
//mod after removing extendtypes file this.cursLies.add(curs);       // ajout de l objet ? coupler
rialto.array.add(this.cursLies,curs);       // ajout de l objet ? coupler
if (!bMajPosCurs)
    curs.placeCurs(this.prop);      // application de la proportion commune ? cet objet 
else
    if (prop){
        this.majPosCurs({prop:prop},'tous');
    }
    else {
        this.majPosCurs(curs);
    }
}

CouplageCurseurs.prototype.remove = function (curs){
//============================
// suppression du couplage d un objet repr?sentant une proportion
  curs.handler = null;            // supp ref sur l 'obj g?rant le couplage 
//  this.cursLies.pop(curs);       //  suppression de la liste des obj coupl?s
  this.cursLies.remove(curs);       //  suppression de la liste des obj coupl?s
}

CouplageCurseurs.prototype.majPosCurs = function (cursRef,force){
//===================================
// mise ? jour des proportions repr?sent?es par les diff?rents obj coupl?s ; 
// si un obj avec 1 attribut prop (par exemple un des curseurs coupl?s, mais pas n?cessairement)
//   est pass? en argument cette valeur devient celle de r?f?rence et est appliqu?e ? l'ensemble des curseurs li?s.
// sinon c'est la proportion actuelle de r?ference d?tenue par le coupleur qui est utilis?e pour harmoniser 
//   les proportions des diff?rents obj coupl?s.
traceExec('majPosCurs entree',10);
var forceMaj = cursRef ? force || false: true;
/*  this.prop = cursRef   ? (cursRef.complementProp   ? (1 - cursRef.prop)
                                                    : cursRef.prop)
                        : this.prop;
*/
  this.prop = cursRef   ? cursRef.prop
                        : this.prop;
traceExec('majPosCurs couplageCurseurs.prop = '+this.prop,10);
  for (var i=0; i< this.cursLies.length; i++){
//       alert('majPosCurs '+this.cursLies[i].id+' this.cursLies[i].prop= '+this.cursLies[i].prop+'/this.prop= '+this.prop);
//       var propNorm  = this.cursLies[i].complementProp    ? (1 - this.cursLies[i].prop)
//                                                          :  this.cursLies[i].prop;
       traceExec('majPosCurs curs n? '+i+' '+this.cursLies[i].prop+' != ? '+this.prop,10);
       if (  (this.cursLies[i].prop != this.prop)
//       if (  (propNorm != this.prop)
          || (forceMaj == 'tous')
          || (    (forceMaj)
              &&  (this.cursLies[i] != cursRef))){
              traceExec('majPosCurs curs n? '+i+' ->placeCurs('+this.prop+')',10);
        this.cursLies[i].placeCurs(this.prop);
        }
/*              
          alert('majPosCurs --> placeCurs '+this.cursLies[i].id);
           if (   (forceMaj == 'tous')
               || (this.cursLies[i] != cursRef) )
              this.cursLies[i].placeCurs(this.prop);
//              this.cursLies[i].placeCurs();  // oubli de l argt this.prop ?  a revoir
           else
*/
/*
       if (  (this.cursLies[i].prop != this.prop)
          || forceMaj) {
           if (forceMaj)
              this.cursLies[i].placeCurs();  // oubli de l argt this.prop ?  a revoir
           else
              this.cursLies[i].placeCurs(this.prop);
}
*/
  }
}

CouplageCurseurs.prototype.nbInstances = 0;


pixWidthCurs = function(oHtml){
//========================
var prc = 1;
var nd = oHtml;
var percent = true;
do {
   var ndstyle = nd.currentStyle ? nd.currentStyle : nd.style;
   var taille=ndstyle.width;
   //auto
   if (taille=="auto"){
       i=1;
       taille=100;
   }
   else
      i =  ndstyle.width.indexOf('%');

   if (i == -1)
     percent = false;
   else
     prc = prc * parseInt(taille) / 100;
} while (percent && (nd=nd.parentNode))

if (   (ndstyle.borderStyle != 'none')
    && (ndstyle.borderStyle != '') )
  tailleBord=parseInt(ndstyle.borderWidth);
else
  tailleBord=0;

return (prc * (parseInt(taille)-tailleBord*2));
}

pixHeightCurs = function(oHtml){
//========================
var prc = 1;
var nd = oHtml;
var percent = true;
do {
   var ndstyle = nd.currentStyle ? nd.currentStyle : nd.style;
   var taille=ndstyle.height;
   //auto : simule 100%
   if (taille=="auto"){
       i=1;
       taille=100;
   }
   else
       i =  ndstyle.height.indexOf('%');

   if (i == -1)
     percent = false;
   else
     prc = prc * parseInt(taille) / 100;

}while (percent && (nd=nd.parentNode))

// bordures

if (   (ndstyle.borderStyle != 'none')
    && (ndstyle.borderStyle != '') )
  tailleBord=parseInt(ndstyle.borderWidth);
else
 tailleBord=0;

return (prc * (parseInt(taille)-tailleBord*2));
}




//---------------------------------------------------------------------------------------------------------------------------------
// renvoie la direction (sous forme d'1 str (ex: ne) en fonction de la position du curseur
// sur les bords de l'elt
function dirDeplactElt(elt,width,height)
//======================================
{
var dir="";
var xPRC,yPRC;

xPRC = window.event.offsetX;  // positions du curseur relatives ? l'?lt  ? l'origine de l'?vt
yPRC = window.event.offsetY;

if (yPRC < 5)
        dir = "n";
else if (yPRC > (height - 5))
        dir = "s";

if (xPRC < 5)
        dir += "w";
else if (xPRC > (width - 5))
        dir += "e";
//window.status = "dirDeplactElt: elt= " + elt.className + " xPRC= " + xPRC + " yPRC= " + yPRC  + " dir= " + dir;
return dir;
}